// 找出数组中满足和大于等于target的长度最小的连续子数组，并返回其长度，如果不存在符合条件的子数组，返回0

// 思路：用滑动窗口来记录连续子数组的和，设定两个指针left和right，分别指向滑动窗口的左右边界，保证窗口中的和刚好大于target
// 1. left和right都指向0
// 2. 向右移动right，将最右侧元素加入到当前窗口和window_sum中
// 3. 如果window_sum大于等于target，则不断右移left，缩小滑动窗口长度，并更新窗口和最小值，直到window_sum小于target
// 4. 然后继续右移right，知道right 越界
// 5. 输出窗口和最小值作为答案

// 时间复杂度：On
// 滑动窗口的关键在于如何移动起始位置
function minSubArrayLen(target, nums) {
    let size = nums.length
    let ans = size + 1
    let left = 0 // 起始位置
    let right = 0 // 终止位置
    let window_sum = 0

    while (right < size) {
        window_sum += nums[right]
        // 持续的移动起始位置，直到不再满足条件
        while (window_sum >= target) {
            ans = Math.min(ans, right - left + 1)
            window_sum -= nums[left]
            left += 1
        }
        right += 1
    }
    return ans === size + 1 ? 0 : ans
}

let nums = [2, 3, 1, 2, 4, 3]
let target = 7

// let nums = [1, 2, 5]
// let target = 4
console.log(minSubArrayLen(target, nums));
